home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / GL / newton / main.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  7KB  |  314 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  * Newton -- Yossi Friedman, July 1988
  19.  *
  20.  * Command line options:
  21.  *   -f file specifies an alternate model catalog file (the default appears in
  22.  *           config.h)
  23.  *   -D      run in demo mode.  This means that all the windows are opened in
  24.  *           pre-specified locations.
  25.  *
  26.  *   if compiled with the -DCONFIG_FILE flag, then
  27.  *
  28.  *   -c file specifies an alternate configuration file (the default appears in
  29.  *         config.h)
  30.  */
  31.  
  32. #include <stdio.h>
  33. #include <string.h>
  34. #include <gl.h>
  35. #include <device.h>
  36.  
  37. #define MAIN
  38.  
  39. #include "config.h"
  40. #include "newton.h"
  41. #include "windows.h"
  42. #include "slider.h"
  43.  
  44. #ifdef MP
  45. #include <sys/types.h>
  46. #include <sys/prctl.h>
  47. #endif /* MP */
  48.  
  49.  
  50. int auto_mode;
  51.  
  52. char *usage
  53. #ifdef CONFIG_FILE
  54.         = "Usage: newton [-f model_catalog] [-c newton_config] [-D]";
  55. #else /* CONFIG_FILE */
  56.         = "Usage: newton [-f model_catalog] [-D]";
  57. #endif /* CONFIG_FILE */
  58.  
  59. main(argc, argv)
  60.     int  argc;
  61.     char **argv;
  62. {
  63.     char *p, *progname;
  64.     int demo_mode;
  65.     int i, j;
  66.     long x0, y0, x1, size_x, size_y;
  67.  
  68.     demo_mode = 0;
  69.     auto_mode = 0;
  70.  
  71.     progname = strrchr(argv[0], '/') ;
  72.     if (progname == NULL) progname = argv[0];
  73.     else progname++;
  74.  
  75.     while (--argc) {
  76.     if (**++argv != '-')
  77.         break;
  78.     
  79.     switch ((*argv)[1]) {
  80.       case 'a':
  81.         auto_mode = 1;
  82.         break;
  83.         
  84.       case 'f':
  85.         if (--argc == 0) {
  86.         fprintf(stderr, "newton: %s\n", usage);
  87.         exit(1);
  88.         }
  89.         model_catalog = *++argv;
  90.         break;
  91.  
  92. #ifdef CONFIG_FILE
  93.  
  94.       case 'c':
  95.         if (--argc == 0) {
  96.         fprintf(stderr, "newton: %s\n", usage);
  97.         exit(1);
  98.         }
  99.         model_config = *++argv;
  100.         break;
  101.  
  102. #endif /* CONFIG_FILE */
  103.  
  104.       case 'D':
  105.         demo_mode = 1;
  106.         break;
  107.         
  108.       default:
  109.         fprintf(stderr, "newton: %s\n", usage);
  110.         exit(1);
  111.     }
  112.     }
  113.  
  114.     if (argc) {
  115.     fprintf(stderr, "newton: %s\n", usage);
  116.     exit(1);
  117.     }
  118.  
  119.     /*
  120.      * set the model directory
  121.      */
  122.     if ((p = strrchr(model_catalog, '/')) != NULL) {
  123.     *p++ = '\0';
  124.     if (chdir(model_catalog) != 0) {
  125.         fprintf(stderr, "newton: Could not chdir to ");
  126.         if (model_catalog[0] == '/')
  127.         fprintf(stderr, "%s\n", model_catalog);
  128.         else
  129.         fprintf(stderr, "%s/%s\n", cwd(), model_catalog);
  130.         exit(1);
  131.     }
  132.     model_catalog = p;
  133.     }
  134.  
  135. #ifdef MP
  136.  
  137.     /*
  138.      * figure out the number of processors
  139.      */
  140.     nproc = prctl(PR_MAXPPROCS);
  141.     if (nproc > MAX_NPROC) {
  142.     fprintf(stderr, "newton: nproc (%d) > MAX_NPROC(%d)\n", nproc, MAX_NPROC);
  143.     nproc = MAX_NPROC;
  144.     }
  145.  
  146.     /*
  147.      * start up the slave(s)
  148.      */
  149.  
  150.     for (i = 1; i < nproc; i++)
  151.     slave_pid[i] = sproc(slave, PR_SALL, i);
  152.  
  153. #endif /* MP */
  154.  
  155.     /*
  156.      * execute the part of the initialization vital for the demo mode, this
  157.      * is kind of a kludge...
  158.      */
  159.     initialize_physics();
  160.     initialize_sliders();
  161.     initialize_draw();
  162.  
  163. #ifdef CONFIG_FILE
  164.     initialize_config();
  165. #endif /* CONFIG_FILE */
  166.  
  167.  
  168.     if (demo_mode) {
  169.     /*
  170.      * This is pretty disgusting.  It kills the generality of the
  171.      * rest of the program, but such is life.
  172.      * it is based on the knowledge that:
  173.      * - the size of the screen is 1280x1024;
  174.      * - the window manager fattens windows by 23 pixels at the top, and
  175.      *   and 5 pixels on all other sides;
  176.      * - there are exactly 6 sliders;
  177.      * - each slider is of size 520x40 pixels;
  178.      * - the aspect ratio of the main window is 5/4.
  179.      */
  180.  
  181. #define SLIDER_WIDTH    520
  182. #define SLIDER_HEIGHT    50
  183.  
  184.     size_x = SLIDER_WIDTH;
  185.     size_y = SLIDER_HEIGHT;
  186.     x0 = 200 + 5;
  187.     y0 = 10 + 5;
  188.     for (i = 0, j = 4; i < 3; i++, j -= 2) {
  189.          prefposition(x0, x0 + size_x, y0, y0 + size_y);
  190.          new_window(open_slider(sliders[j].sid), sliders[j].sid);
  191.          
  192.          x1 = x0 + size_x + 5 + 10 + 5;
  193.          
  194.          prefposition(x1, x1 + size_x, y0, y0 + size_y);
  195.          new_window(open_slider(sliders[j+1].sid), sliders[j+1].sid);
  196.  
  197.         y0 += size_y + 23 + 10 + 5;
  198.     }
  199.  
  200.     size_y = (YMAXSCREEN + 1) - y0 - (23 + 10);
  201.     size_x = size_y * 5 / 4;
  202.     x0 = 200 + ((XMAXSCREEN + 1 - 200) - (5 + size_x + 5)) / 2 + 5;
  203.  
  204.     prefposition(x0, x0 + size_x, y0, y0 + size_y);
  205.     new_window(open_model_window(progname), -1);
  206.     }
  207.     else
  208.     new_window(open_model_window(progname), -1);
  209.  
  210.     find_current_window();
  211.  
  212.     play();
  213.  
  214.     my_exit(0);
  215. }
  216.  
  217.  
  218.  
  219. new_window(wid, sid)
  220.     long wid;
  221.     int sid;
  222. {
  223.     long old_wid;
  224.     struct window *wp;
  225.     long bot_left[2], size[2];
  226.  
  227.     old_wid = winget();
  228.     winset(wid);
  229.     
  230.     getorigin(&bot_left[X], &bot_left[Y]);
  231.     getsize(&size[X], &size[Y]);
  232.  
  233.     wp = (struct window *) malloc(sizeof(struct window));
  234.     if (wp == NULL) {
  235.     fprintf(stderr, "newton: Could not malloc\n");
  236.     my_exit(1);
  237.     }
  238.  
  239.     wp->wid = wid;
  240.     wp->bot_left[X] = bot_left[X];
  241.     wp->bot_left[Y] = bot_left[Y];
  242.     wp->top_right[X] = bot_left[X] + size[X];
  243.     wp->top_right[Y] = bot_left[Y] + size[Y];
  244.     wp->sid = sid;
  245.  
  246.     wp->next = windows;
  247.     windows = wp;
  248.  
  249.     if (old_wid != -1)
  250.     winset(old_wid);
  251. }
  252.  
  253.  
  254. close_current_window()
  255. {
  256.     struct window *wc, *wp;
  257.  
  258.     for (wp = NULL, wc = windows; wc != NULL; wp = wc, wc = wc->next)
  259.     if (wc == current_window)
  260.         break;
  261.     if (wc == NULL) {
  262.     fprintf(stderr, "newton: No current window\n");
  263.     goto finale;
  264.     }
  265.  
  266.     if (wp == NULL)
  267.     windows = wc->next;
  268.     else
  269.     wp->next = wc->next;
  270.  
  271.     free(wc);
  272.  
  273. finale:
  274.     find_current_window();
  275. }
  276.  
  277.  
  278. find_current_window()
  279. {
  280.     short mx, my;
  281.  
  282.     mx = getvaluator(MOUSEX);
  283.     my = getvaluator(MOUSEY);
  284.  
  285.     for (
  286.         current_window = windows;
  287.     current_window != NULL;
  288.     current_window = current_window->next
  289.     )
  290.     if (
  291.             (current_window->bot_left[X] < mx) &&
  292.                                       (mx < current_window->top_right[X])
  293.             &&
  294.             (current_window->bot_left[Y] < my) &&
  295.                                       (my < current_window->top_right[Y])
  296.        )
  297.         break;
  298.     
  299.     /*
  300.      * technically, current_window can end up as NULL.  This can occur if
  301.      * the user closes a slider.  I assume that whenever the above code
  302.      * determines that current_window is NULL, I would get an INPUTCHANGE
  303.      * from the window manager before anything else happens.
  304.      */
  305. }
  306.  
  307.  
  308. my_exit(code)
  309.     int code;
  310. {
  311.     SLAVE_FUNC(SLAVE_DIE);
  312.     exit(code);
  313. }
  314.